热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么`ioctl(fd,EVIOCGRAB,1)`有时会导致密钥垃圾邮件?

如何解决《为什么`ioctl(fd,EVIOCGRAB,1)`有时会导致密钥垃圾邮件?》经验,为你挑选了1个好方法。

我正在尝试编写自己的"键盘驱动程序"(没有实际编写内核模块),通过抓取键盘,我认为是用户空间中最低级别的抽象:/dev/input/event*.

下面的代码执行霎那,只要你改变的第一ocurrence ioctl(fd, EVIOCGRAB, UNGRAB)ioctl(fd, EVIOCGRAB, GRAB).

// gcc main.c -o main

#include 
#include 
#include 
#include 
#include 
#include 

#define EXIT_KEY  KEY_ESC
#define UNGRAB    0
#define GRAB      1

const char* kbd_device = "/dev/input/event4";

// ------------------------------------------------------------------------------------------------
int main(void){
  int fd = open(kbd_device, O_RDONLY);
  if(fd == -1){
    printf("Cannot open %s. %s.\n", kbd_device, strerror(errno));
    return -1;
  }

  if(ioctl(fd, EVIOCGRAB, UNGRAB))
    printf("Couldn't grab %s. %s.\n", kbd_device, strerror(errno));
  else
    printf("Grabbed %s!\n", kbd_device);

  while(1){
    struct input_event event;
    read(fd, &event, sizeof(event));
    if (event.type == EV_KEY && event.value >= 0 && event.value <= 2){
      printf("%d %3d\n", event.value, event.code);

      if(event.code == EXIT_KEY){
        ioctl(fd, EVIOCGRAB, UNGRAB);
        close(fd);
        return 0;
      }

    }
  }
}
问题

如果我跑gcc main.c -o main && sudo ./main,一切都按预期工作.

但是,如果先编译然后运行sudo ./main,终端会不停地向下滚动,就像按住RETURN键一样.

为什么会这样?

笔记

我正在运行Ubuntu 14.04

在我的平台上,/dev/input/event4碰巧是键盘

动机

我正在尝试编写一个键盘"驱动程序",它既可以在X上运行,也可以在X上运行(例如,一个TTY).

我理解X11的键盘库/扩展名是XKB.我认为TTY的键盘库是linux/divers/tty/vt/keyboard.c(源),它使用的初始键盘映射是linux/drivers/tty/vt/defkeymap.map(源),可以使用loadkeys(source here)进行修改.如果我错了,请纠正我.



1> ephemient..:

当你输入

gcc main.c -o main && sudo ./main ?

GCC需要一些时间,因此密钥已经被时间./main运行释放.

当你输入

sudo ./main ?

一旦你按下,终端就会向shell发送换行符,然后开始执行./main.然后,您的程序会看到已发布的事件,但您的终端却看不到,因为您的程序已经抓住了输入设备.因此,到终端看起来像是被卡住了,所以它继续产生换行符.


推荐阅读
author-avatar
xieyuhua
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有